bitkeeper revision 1.1159.246.2 (4204c18cvI5Uk50dXB8wqfQwKj9ZGw)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 5 Feb 2005 12:52:28 +0000 (12:52 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 5 Feb 2005 12:52:28 +0000 (12:52 +0000)
Manual merge.
Signed-off-by: keir.fraser@Cl.cam.ac.uk
xen/arch/x86/traps.c
xen/common/schedule.c

index b7e3ba006b493219a898eebac6081f3118a38b9a..55c767bdca90d894e2da86e533e7600928003c82 100644 (file)
@@ -567,14 +567,14 @@ asmlinkage void io_check_error(struct xen_regs *regs)
     fatal_trap(TRAP_nmi, regs);
 }
 
-static void unknown_nmi_error(unsigned char reason, struct xen_regs * regs)
+static void unknown_nmi_error(unsigned char reason)
 {
     printk("Uhhuh. NMI received for unknown reason %02x.\n", reason);
     printk("Dazed and confused, but trying to continue\n");
     printk("Do you have a strange power saving mode enabled?\n");
 }
 
-asmlinkage void do_nmi(struct xen_regs * regs, unsigned long reason)
+asmlinkage void do_nmi(struct xen_regs *regs, unsigned long reason)
 {
     ++nmi_count(smp_processor_id());
 
@@ -583,7 +583,7 @@ asmlinkage void do_nmi(struct xen_regs * regs, unsigned long reason)
         nmi_watchdog_tick(regs);
     else
 #endif
-        unknown_nmi_error((unsigned char)(reason&0xff), regs);
+        unknown_nmi_error((unsigned char)(reason&0xff));
 }
 
 unsigned long nmi_softirq_reason;
@@ -671,6 +671,13 @@ asmlinkage int do_spurious_interrupt_bug(struct xen_regs *regs)
     return EXCRET_not_a_fault;
 }
 
+BUILD_SMP_INTERRUPT(deferred_nmi, TRAP_deferred_nmi)
+asmlinkage void smp_deferred_nmi(struct xen_regs regs)
+{
+    ack_APIC_irq();
+    do_nmi(&regs, 0);
+}
+
 void set_intr_gate(unsigned int n, void *addr)
 {
     _set_gate(idt_table+n,14,0,addr);
@@ -728,7 +735,7 @@ void __init trap_init(void)
     set_intr_gate(TRAP_alignment_check,&alignment_check);
     set_intr_gate(TRAP_machine_check,&machine_check);
     set_intr_gate(TRAP_simd_error,&simd_coprocessor_error);
-    set_intr_gate(TRAP_deferred_nmi,&nmi);
+    set_intr_gate(TRAP_deferred_nmi,&deferred_nmi);
 
 #if defined(__i386__)
     _set_gate(idt_table+HYPERCALL_VECTOR, 14, 1, &hypercall);
index 46176cf820ee3bd52aeaae730913128a2d947bb2..e0fafa6b9c9425488a8a2a3147f0ed9abf26bade 100644 (file)
@@ -373,13 +373,6 @@ void __enter_scheduler(void)
     task_slice_t        next_slice;
     s32                 r_time;     /* time for new dom to run */
 
-    if ( !is_idle_task(current->domain) )
-    {
-        LOCK_BIGLOCK(current->domain);
-        cleanup_writable_pagetable(prev->domain);
-        UNLOCK_BIGLOCK(current->domain);
-    }
-
     perfc_incrc(sched_run);
     
     spin_lock_irq(&schedule_data[cpu].schedule_lock);
@@ -429,6 +422,13 @@ void __enter_scheduler(void)
     
     perfc_incrc(sched_ctx);
 
+    if ( !is_idle_task(current->domain) )
+    {
+        LOCK_BIGLOCK(current->domain);
+        cleanup_writable_pagetable(prev->domain);
+        UNLOCK_BIGLOCK(current->domain);
+    }
+
 #if defined(WAKE_HISTO)
     if ( !is_idle_task(next) && next->wokenup ) {
         ulong diff = (ulong)(now - next->wokenup);